home *** CD-ROM | disk | FTP | other *** search
/ Personal Paint v7.1 / Cloanto Personal Paint v7.1.iso / rexx / animpath.pprx < prev    next >
Text File  |  1997-05-11  |  60KB  |  1,980 lines

  1. /* Personal Paint Amiga Rexx script - Copyright ⌐ 1997 Cloanto Italia srl */
  2.  
  3. /* $VER: AnimPath.pprx 1.3 */
  4.  
  5. /** ENG
  6.  This script can be used to easily create animations with
  7.  moving and transforming objects.
  8.  
  9.  The main requester gives access to the following commands:
  10.  
  11.  - New: the path is cleared and the brush transformations are set
  12.    to their defaults.
  13.  
  14.  - Load: an existing path file can be selected using the file requester;
  15.    this causes the path coordinates, the brush transformation settings
  16.    and the animation settings to be loaded (note: this data
  17.    is stored in ASCII format and can easily be algorithmically
  18.    generated and manipulated by other programs).
  19.  
  20.  - Save: this command writes a path file using the current path data.
  21.  
  22.  - Define Freehand: the mouse can be used to "draw" the path;
  23.    both the direction of the path and the mouse movement speed
  24.    affect the resulting animation: the original direction
  25.    is used to render the frames (the starting point is used
  26.    to place the object in the first frame and the last point
  27.    is used for the last frame) and the drawing speed
  28.    affects the number and the "density" of stored points
  29.    (the slower the speed, the more points, and
  30.    vice versa) and defines the perceived speed of the animation
  31.    (e.g. a path defined with a high initial speed and a slow
  32.    ending speed leads to a corresponding animation).
  33.    Before the mouse button is pressed, the brush is displayed to ease
  34.    positioning in the first frame.
  35.  
  36.  - Define Linear: the mouse can be used to define a linear path
  37.    (simply consisting of a starting point and an ending point);
  38.    unlike the freehand path, this kind of path produces a
  39.    constant-speed animation (equally-spaced intermediate points
  40.    are generated automatically).
  41.  
  42.  - Edit: this command can be used to visually edit the path;
  43.    the "path points" can be dragged with the mouse to change the
  44.    path shape and/or density (speed); the <m> key toggles
  45.    the magnify mode on or off, and the right mouse button or the <Esc> key
  46.    can be pressed to leave the editing mode.
  47.  
  48.  - Move and Resize: the mouse can be used to resize the animation
  49.    path (clicking on the lower right part of the path) or to drag it
  50.    to a new position (clicking on the upper part). This is useful
  51.    to create paths with point outside the screen, which cannot be
  52.    drawn by hand. The <m> key toggles the magnify mode on or off, and
  53.    the right mouse button or the <Esc> key can be pressed
  54.    to exit from the move and resize mode.
  55.  
  56.  - Brush Angle: the Brush Angle requester is used to set
  57.    the number of brush rotations ("Rotation Cycles"), the starting
  58.    ("From Angle") and ending angle ("To Angle"), and the
  59.    rotation direction ("Direction": "Clockwise/Counterclockwise");
  60.    a number of rotations greater than 1 can be used to add
  61.    additional 360░ spins in the specified direction.
  62.  
  63.  - Brush Shear: the Brush Shear requester is used to set
  64.    the number of shear cycles ("Shear Cycles"), the starting and
  65.    ending horizontal shear ("From Horizontal", "To Horizontal"),
  66.    and the starting and ending vertical shear ("From Vertical",
  67.    "To Vertical"); if a number of shear cycles greather than 1 is specified,
  68.    the shear factors will move back and forth within the specified
  69.    limits (an odd number of cycles must be used to reach the ending
  70.    shear in the last frame).
  71.  
  72.  - Brush Size: the Brush Size requester is used to set
  73.    the number of resize cycles ("Resize Cycles"), the starting and
  74.    ending horizontal size ("From Horizontal", "To Horizontal",
  75.    in percentage of the original size), and the starting and ending
  76.    vertical size ("From Vertical", "To Vertical");
  77.    if a number of resize cycles greather than 1 is specified,
  78.    the resize factors will move back and forth within the specified
  79.    limits (an odd number of cycles must be used to reach the ending
  80.    size in the last frame).
  81.  
  82.  - Data: the data requester can be used to view the path data
  83.    at a glance (animation, rotation, shear and resize settings,
  84.    followed by the path coordinates).
  85.  
  86.  - Preview: this command can be used to preview the animation;
  87.    when one or more brush effects are involved, the brush image
  88.    is replaced by an outline (the inner arrow points to the top
  89.    of the brush).
  90.  
  91.  The main requester also contains gadgets to set the animation
  92.  frames ("Count"), the recording direction ("Direction":
  93.  "Forward/Backward/Still" - the frame step) and the frame insertion option
  94.  ("Add Frames" - if active, "Count" frames are inserted).
  95.  
  96.  When using freehand paths with no brush effect, the "Count"
  97.  setting should not be set to a number greater than the path points
  98.  (as reported by the Data requester), as this would generate one or more
  99.  duplicate frames.
  100.  
  101.  The bottom gadgets in the main requester can be used to render
  102.  the animation ("Draw", which also terminates the script) or to
  103.  quit the script ("Quit"). A copy of the current path is
  104.  always temporarily stored, so that it can be used when the script is
  105.  run again.
  106.  
  107.  The following program settings affect the animation appearance and
  108.  quality: the current brush (anim-brushes can be used to
  109.  create complex animation effects), the brush handle position,
  110.  the brush paint mode (and the foreground color, if the "Color" mode
  111.  is active) and the "Color average resize" option.
  112. */
  113.  
  114. /** DEU
  115.  Dieses Skript erm÷glicht die einfache Erzeugung von Animationen, in deren
  116.  Verlauf Objekte bewegt und verwandelt werden.
  117.  
  118.  Im Haupt-Dialogfenster erfolgt der Zugriff auf folgende Befehle:
  119.  
  120.  - Neu: L÷scht den alten Pfad und setzt die Pinseltransformationen auf die
  121.    Standardwerte zurⁿck.
  122.  
  123.  - Laden: Mit dem Dateiauswahlfenster lΣ▀t sich eine zuvor gespeicherte
  124.    Pfaddatei auswΣhlen. Dabei werden Pfadkoordinaten, Einstellungen fⁿr die
  125.    Pinseltransformation und verschiedene Animationseinstellungen geladen.
  126.    Hinweis: Diese Daten liegen im ASCII-Format vor und lassen sich daher auf
  127.    einfache Weise mit Hilfe anderer Programme algorithmisch erzeugen und/oder
  128.    verΣndern.
  129.  
  130.  - Speichern: Schreibt eine Pfaddatei unter Verwendung der aktuellen
  131.    Pfaddaten.
  132.  
  133.  - Frei festlegen: Erm÷glicht die Bestimmung des Pfades mit Hilfe der Maus.
  134.    Sowohl dessen Verlauf als auch die Geschwindigkeit der Mausbewegung
  135.    beeinflussen den spΣteren Animationsablauf: Die ursprⁿngliche Richtung wird
  136.    zur Berechnung der Einzelbilder verwendet (Das erste Einzelbild wird am
  137.    Startpunkt berechnet, das letzte dementsprechend am Zielpunkt), wΣhrend die
  138.    Geschwindigkeit des Zeichenvorgangs sowohl Anzahl als auch Abstand
  139.    ("Dichte") der gespeicherten Punkte beeinflu▀t. Dabei gilt: Je geringer die
  140.    Geschwindigkeit, desto mehr Punkte, und umgekehrt. Auch die
  141.    Ablaufgeschwindigkeit hΣngt von diesem Faktor ab, d. h. ein mit hoher
  142.    Anfangs- und geringer Endgeschwindigkeit definierter Pfad erzeugt eine
  143.    dementsprechend mit zunehmend geringerer Geschwindigkeit ablaufende
  144.    Animation. Um die Festlegung der Position fⁿr das erste Einzelbild zu
  145.    erleichtern, wird vor der BetΣtigung der linken Maustaste das aktuelle
  146.    Zeichen angezeigt.
  147.  
  148.  - Linear festlegen: Erm÷glicht die Bestimmung eines linearen Pfades, welcher
  149.    lediglich durch Anfangs- und Endpunkt festgelegt wird. Im Gegensatz zum frei
  150.    festgelegten Pfad wird hierdurch eine Animation erzeugt, die ⁿber ihren
  151.    gesamten Verlauf hinweg eine konstante Geschwindigkeit beibehΣlt, da die
  152.    Zwischenpunkte automatisch alle im gleichen Abstand voneinander angeordnet
  153.    werden.
  154.  
  155.  - Bearbeiten: Dient zur visuellen Bearbeitung des Pfades. Durch Verschieben
  156.    der einzelnen Knotenpunkte des Pfades mit der Maus lassen sich Form und
  157.    Dichte (Geschwindigkeit) Σndern. Mit Hilfe der Taste <m> kann die
  158.    Lupfenfunktion an- oder ausgeschaltet werden. Um den Bearbeitungsmodus zu
  159.    verlassen, ist die <Esc>-Taste zu drⁿcken.
  160.  
  161.  - Position und Gr÷▀e: Hiermit lassen sich unter Verwendung der Maus Position
  162.    (durch Anklicken des rechten unteren Pfadteils) und Gr÷▀e (durch Anklicken
  163.    des oberen Teils) des Animationspfades Σndern. Dies eignet sich besonders
  164.    zur Erzeugung von Animationspfaden, die aus dem sichtbaren Bereich
  165.    hinauslaufen, da sich diese nicht von Hand zeichnen lassen. Mit <m> lΣ▀t
  166.    sich jederzeit die Lupe an- oder ausschalten, und mit <Esc> wird der Modus
  167.    "Position und Bewegung" verlassen.
  168.  
  169.  - Pinsel drehen: In diesem Dialogfenster werden die Anzahl der Umdrehungen
  170.    ("Umdrehungen"), der Startwinkel ("Startwinkel"), der Zielwinkel
  171.    ("Zielwinkel") und der Drehsinn ("Rechts herum/Links herum" festgelegt;
  172.    durch die Angabe eines Wertes >1 lassen sich zusΣtzliche volle Umdrehungen
  173.    erzeugen.
  174.  
  175.  - Pinsel kippen: In diesem Dialogfenster werden die Anzahl der
  176.    KippdurchlΣufe ("DurchlΣufe") und der Start- und Zielwinkel des Kippvorgangs
  177.    ("Von Winkel", "Bis Winkel") festgelegt; durch die Angabe eines Kipp-Wertes
  178.    >1 pendeln die Kippwerte zwischen den angegebenen Grenzwerten hin und her.
  179.    Hinweis: Um den Kipp-Endwert beim letzten Einzelbild zu erreichen, mu▀ eine
  180.    gerade Anzahl von DurchlΣufen angegeben werden.
  181.  
  182.  - Pinselgr÷▀e: Dieses Dialogfenster dient zum Einstellen der
  183.    ─nderungsdurchlΣufe fⁿr die Pinselgr÷▀e ("DurchlΣufe"), der Start- und
  184.    Zielgr÷▀e ("Von" und "Bis" in Prozent der ursprⁿnglichen Gr÷▀e); wenn mehr
  185.    als ein ─nderungsdurchlauf festgelegt wird, pendelt der
  186.    Gr÷▀enΣnderungsfaktor zwischen den angegebenen Grenzwerten hin und her.
  187.    Hinweis: Um den Endwert beim letzten Einzelbild zu erreichen, mu▀ eine
  188.    gerade Anzahl von DurchlΣufen angegeben werden.
  189.  
  190.  - Im Daten-Dialogfenster werden alle Pfadinformationen auf einen Blick
  191.    dargestellt: Animation, Zeichen, Umdrehung, Kippwerte, Gr÷▀eneinstellungen
  192.    und Pfadkoordinaten.
  193.  
  194.  - Vorschau: Mit diesem Befehl lΣ▀t sich eine Vorschau der Animation
  195.    betrachten. Wenn ein oder mehrere Pinseleffekte eingesetzt wurden, erscheint
  196.    der Pinsel nur als Umri▀. Der darin angezeigte Pfeil zeigt zur
  197.    Pinseloberkante.
  198.  
  199.  Das Haupt-Dialogfenster enthΣlt daneben auch Funktionen zum Festlegen der
  200.  Einzelbilder einer Animation ("ZΣhler"), der Aufzeichnungsrichtung
  201.  ("Richtung":"VorwΣrts/RⁿckwΣrts/Stillstand" - die Schrittweite) und zum
  202.  Einfⁿgen von Einzelbildern ("Bilder add." - wenn aktiviert, werden unter
  203.  "ZΣhler" Bilder hinzugefⁿgt).
  204.  
  205.  Bei der Verwendung eines frei festgelegten Pfades ohne einen Pinseleffekt
  206.  sollte der "ZΣhler"-Wert die Anzahl der Knotenpunkte des Pfades (wie im
  207.  Daten-Dialogfenster angezeigt) nicht ⁿberschreiten, da dies zur Duplizierung
  208.  eines oder mehrerer Einzelbilder fⁿhren wⁿrde. Die unteren Funktionselemente
  209.  im Haupt-Dialogfenster dienen zum Erzeugen der Animation ("Zeichnen", dient
  210.  auch zum Abbrechen des Skripts) und zum Beenden des Skripts ("Verlassen").
  211.  Es wird immer eine temporΣre Kopie des aktuellen Pfades gespeichert, die bei
  212.  einem erneuten Aurufen des aktuellen Skripts geladen wird.
  213.  
  214.  Folgende Programmeinstellungen beeinflussen Erscheinungsbild und QualitΣt
  215.  der Animation: Der aktuelle Pinsel (zum Erzielen komplexer Animationseffekte
  216.  lassen sich Animationspinsel verwenden),die Griffpunktposition, der
  217.  Pinsel-Malmodus (und die Vordergrundfarbe bei aktivem "Farbe"-Modus), sowie
  218.  die Option "Farbe mit Gr÷▀e Σndern".
  219. */
  220.  
  221. /** ITA
  222.  Questo script permette di creare facilmente animazioni con oggetti
  223.  che si muovono e si trasformano.
  224.  
  225.  La finestra di dialogo principale mette a disposizione i seguenti comandi:
  226.  
  227.  - Nuovo: il percorso Φ cancellato e le trasformazioni del pennello
  228.    sono riportate a valori predefiniti.
  229.  
  230.  - Leggere: si pu≥ scegliere un file di percorso giα esistente tramite la
  231.    finestra di scelta file; ci≥ comporta il caricamento delle coordinate del
  232.    percorso, delle impostazioni di trasformazione del pennello e di quelle
  233.    relative all'animazione (nota: tali dati sono immagazzinati in formato
  234.    ASCII e possono essere facilmente generati tramite algoritmi nonchΘ
  235.    manipolati da altri programmi).
  236.  
  237.  - Scrivere: Questo comando salva un file di percorso usando i dato del percorso
  238.    attuale.
  239.  
  240.  - Definire a mano libera: si pu≥ usare il mouse per "tracciare" il percorso;
  241.    l'animazione risultante Φ influenzata sia dalla direzione del percorso sia
  242.    dalla velocitα di spostamento del mouse: la direzione originale Φ usata
  243.    per disegnare i fotogrammi (il punto di partenza Φ utilizzato per piazzare
  244.    l'oggetto nel primo fotogramma e l'ultimo punto Φ usato per il fotogramma
  245.    finale) mentre la velocitα del tracciamento influenza il numero e la
  246.    "densitα" dei punti memorizzati (tanto Φ pi∙ lenta la velocitα, tanto
  247.    maggiore il numero dei punti, e viceversa) e definisce la velocitα
  248.    percepita dell'animazione (es. un percorso definito con una alta velocitα
  249.    iniziale ed una bassa velocitα finale porta ad una animazione con
  250.    caratteristiche corrispondenti).
  251.    Prima di premere il pulsante del mouse, si visualizza il pennello per
  252.    facilitare il posizionamento del primo fotogramma.
  253.  
  254.  - Definire lineare: si pu≥ usare il mouse per definire un percorso lineare
  255.    (che consiste semplicemente di un punto di partenza e uno d'arrivo);
  256.    a differenza del percorso a mano libera, questo tipo di percorso produce
  257.    un'animazione a velocitα costante (i punti intermedi sono generati in modo
  258.    automatico a distanze tra loro eguali).
  259.  
  260.  - Modificare: si pu≥ usare questo comando per modificare in modo
  261.    visivo il percorso; i "punti del percorso" possono essere spostati col
  262.    mouse per cambiare la forma del percorso e/o la densitα (velocitα); il
  263.    tasto <m> attiva/disattiva l'ingrandimento, e il tasto destro del mouse
  264.    o il tasto <Esc> possono essere premuti per uscire dalla modalitα di
  265.    modifica percorso.
  266.  
  267.  - Spostare e ridimensionare: si pu≥ usare il mouse per ridimensionare il
  268.    percorso dell'animazione (facendo click sulla parte inferiore destra dello
  269.    stesso) o spostarlo in una nuova posizione (facendo click sulla parte
  270.    superiore). Ci≥ Φ utile per creare percorsi con punti all'esterno dello
  271.    schermo, che non si possono piazzare manualmente. Il tasto <m>
  272.    attiva/disattiva l'ingrandimento, e il tasto destro del mouse o il tasto
  273.    <Esc> possono essere premuti per uscire dalla modalitα di spostamento e
  274.    ridimensionamento.
  275.  
  276.  - Angolo pennello: si usa la finestra di dialogo Angolo pennello
  277.    per impostare il numero di rotazioni del pennello ("Cicli rotazione"),
  278.    l'angolo iniziale ("Da angolo") e finale ("Ad angolo"), e la direzione
  279.    della rotazione ("Senso": "Orario/Antiorario"); si pu≥ usare un numero di
  280.    rotazioni maggiore di 1 per aggiungere ulteriori avvitamenti a 360░ nella
  281.    direzione specificata.
  282.  
  283.  - Inclinazione pennello: si usa la finestra di dialogo Inclinazione pennello
  284.    per impostare il numero di cicli di inclinazione ("Cicli inclinazione"), e
  285.    il livello di inclinazione iniziale e finale ("Da angolo", "Ad angolo");
  286.    se si specifica un numero di cicli di inclinazione maggiore di 1, i fattori
  287.    di inclinazione si sposteranno avanti ed indietro entro i limiti specificati
  288.    (si deve usare un numero dispari di cicli per raggiungere l'inclinazione
  289.    finale nell'ultimo fotogramma).
  290.  
  291.  - Dimensione pennello: si usa la finestra di dialogo Dimensione pennello per
  292.    impostare il numero di cicli di ridimensionamento ("Cicli
  293.    ridimensionamento"), la dimensione iniziale e finale in senso orizzontale
  294.    ("Da orizzontale" e "A orizzontale", in percentuale della dimensione
  295.    iniziale); la dimensione iniziale e finale in senso verticale ("Da
  296.    verticale", "A verticale"); se si specifica un numero di cicli
  297.    di ridimensionamento maggiore di 1, il fattore di ridimensionamento si
  298.    sposterα avanti ed indietro entro i limiti specificati (si deve usare un
  299.    numero dispari di cicli per raggiungere la dimensione finale nell'ultimo
  300.    fotogramma).
  301.  
  302.  - Dati: si usa la finestra di dialogo Dati percorso per vedere tutte
  303.    le informazioni relative al percorso con un solo colpo d'occhio
  304.    (impostazioni per animazione, rotazione, inclinazione, ridimensionamento,
  305.    seguite dalle coordinate del percorso).
  306.  
  307.  - Anteprima: si usa questo comando per vedere una anteprima dell'animazione;
  308.    quando sono implicati uno o pi∙ effetti relativi al pennello, l'immagine
  309.    dello stesso Φ sostituita da un contorno (la freccia interna indica la
  310.    sommitα del pennello).
  311.  
  312.  La finestra principale contiene anche pulsanti per impostare il numero di
  313.  fotogrammi dell'animazione ("Passi"), la direzione di registrazione
  314.  ("Direzione": "Avanti/Indietro/Fermo" - il passo fotogramma) e l'opzione per
  315.  l'inserimento di fotogrammi ("Aggiunta fotogrammi" - se Φ attiva, saranno
  316.  inseriti tanti fotogrammi quanti indicato da "Passi").
  317.  
  318.  Quando si usano percorsi a mano libera senza effetti sul pennello, il numero
  319.  specificato in "Passi" non dovrebbe essere maggiore del numero di punti del
  320.  percorso (come riferito dalla finestra di dialogo Dati percorso), perchΘ in
  321.  questo modo si otterrebbero uno o pi∙ fotogrammi doppi.
  322.  
  323.  Si possono usare i pulsanti sulla parte inferiore della finestra di dialogo
  324.  principale per realizzare l'animazione ("Animare", che inoltre fa terminare
  325.  lo script) o per uscire dallo script ("Uscire"). Il percorso attuale viene
  326.  temporaneamente "ricordato", perchΘ sia possibile usarlo quando si avvia
  327.  nuovamente lo script.
  328.  
  329.  Le seguenti impostazioni del programma influenzano l'aspetto e la qualitα
  330.  dell'animazione: pennello corrente (si possono usare anim-brush per creare
  331.  complessi effetti di animazione), posizione della maniglia di manipolazione
  332.  pennello, modo di disegno pennello (e colore di primo piano, se Φ attivo il
  333.  modo "Colore"), opzione di "Color average resize".
  334. */
  335.  
  336. IF ARG(1, EXISTS) THEN
  337.     PARSE ARG PPPORT
  338. ELSE
  339.     PPPORT = 'PPAINT'
  340.  
  341. IF ~SHOW('P', PPPORT) THEN DO
  342.     IF EXISTS('PPaint:PPaint') THEN DO
  343.         ADDRESS COMMAND 'Run >NIL: PPaint:PPaint'
  344.         DO 30 WHILE ~SHOW('P',PPPORT)
  345.              ADDRESS COMMAND 'Wait >NIL: 1 SEC'
  346.         END
  347.     END
  348.     ELSE DO
  349.         SAY "Personal Paint could not be loaded."
  350.         EXIT 10
  351.     END
  352. END
  353.  
  354. IF ~SHOW('P', PPPORT) THEN DO
  355.     SAY 'Personal Paint Rexx port could not be opened'
  356.     EXIT 10
  357. END
  358.  
  359. ADDRESS VALUE PPPORT
  360. OPTIONS RESULTS
  361. OPTIONS FAILAT 10000
  362.  
  363. Get 'LANG'
  364. IF RESULT = 1 THEN DO        /* Deutsch */
  365.     global.txt_title_menu  = 'AnimPinsel-Pfad'
  366.     global.txt_title_new   = 'Neuer Animationspfad'
  367.     global.txt_title_load  = 'Animationspfad laden'
  368.     global.txt_title_save  = 'Animationspfad speichern'
  369.     global.txt_title_fhand = 'Pfad frei festlegen'
  370.     global.txt_title_line  = 'Pfad linear festlegen'
  371.     global.txt_title_edit  = 'Animationspfad bearbeiten'
  372.     global.txt_title_movrs = 'Pfadposition/-gr÷▀e Σndern'
  373.     global.txt_title_brot  = 'Pinsel drehen'
  374.     global.txt_title_bshr  = 'Pinsel kippen'
  375.     global.txt_title_bresz = 'Pinselgr÷▀e'
  376.     global.txt_title_pview = 'Animationsvorschau'
  377.     global.txt_title_draw  = 'Animation zeichnen'
  378.     global.txt_title_data  = 'Pfadinformationen'
  379.  
  380.     global.txt_menu_new    = 'Neu'
  381.     global.txt_menu_load   = 'Laden...'
  382.     global.txt_menu_save   = 'Speichern...'
  383.     global.txt_menu_fhand  = 'Frei festlegen'
  384.     global.txt_menu_line   = 'Linear festlegen'
  385.     global.txt_menu_edit   = 'Bearbeiten'
  386.     global.txt_menu_movrs  = 'Position/Gr÷▀e'
  387.     global.txt_menu_brot   = 'Pinsel drehen...'
  388.     global.txt_menu_bshr   = 'Pinsel kippen...'
  389.     global.txt_menu_bresz  = 'Pinselgr÷▀e...'
  390.     global.txt_menu_data   = 'Informationen...'
  391.     global.txt_menu_prview = 'Preview'
  392.  
  393.     global.txt_gad_count   = 'Z_Σhler:'
  394.     global.txt_gad_add     = '_Frames add.:'
  395.     global.txt_gad_addf.0  = 'Nein'
  396.     global.txt_gad_addf.1  = 'Ja'
  397.     global.txt_gad_direct  = '_Richtung:'
  398.     global.txt_gad_dirct.0 = 'VorwΣrts'
  399.     global.txt_gad_dirct.1 = 'RⁿckwΣrts'
  400.     global.txt_gad_dirct.2 = 'Stillstand'
  401.     global.txt_gad_draw    = '_Zeichnen'
  402.     global.txt_gad_quit    = '_Verlassen'
  403.     global.txt_gad_rotats  = '_Umdrehungen:'
  404.     global.txt_gad_fromang = '_Startwinkel:'
  405.     global.txt_gad_toang   = '_Zielwinkel:'
  406.     global.txt_gad_rotdir  = '_Richtung:'
  407.     global.txt_gad_rotdr.0 = 'Rechts herum'
  408.     global.txt_gad_rotdr.1 = 'Links herum'
  409.     global.txt_gad_shears  = '_DurchlΣufe:'
  410.     global.txt_gad_fromshx = '_Von Horizontal:'
  411.     global.txt_gad_toshx   = '_Bis Horizontal:'
  412.     global.txt_gad_fromshy = 'V_on Vertikal:'
  413.     global.txt_gad_toshy   = 'B_is Vertikal:'
  414.     global.txt_gad_resizes = '_DurchlΣufe:'
  415.     global.txt_gad_fromrsx = '_Von Horizontal (%):'
  416.     global.txt_gad_torsx   = '_Bis Horizontal (%):'
  417.     global.txt_gad_fromrsy = 'V_on Vertikal (%):'
  418.     global.txt_gad_torsy   = 'B_is Vertikal (%):'
  419.     global.txt_msg_points  = 'Punkte:'
  420.     global.txt_msg_ptype.0 = '(Freier Pfad)'
  421.     global.txt_msg_ptype.1 = '(Linearer Pfad)'
  422.  
  423.     global.txt_err_oldcl   = 'Dieses Skript erfordert eine neuere_Version von Personal Paint'
  424.     global.txt_err_lost    = 'Pfaddaten gehen verloren'
  425.     global.txt_err_load    = 'Pfaddatei kann nicht ge÷ffnet werden'
  426.     global.txt_err_nopath  = 'Keine Pfaddefinition vorhanden'
  427.     global.txt_err_save    = 'Pfad kann nicht gespeichert werden'
  428.     global.txt_err_nocbsh  = 'Transformation lΣ▀t sich nur auf benutzer-_definierten Pinsel anwenden'
  429.     global.txt_err_notbsh  = 'Transformation nicht durchfⁿrbar: Zu wenig Platz fⁿr temporΣren Pinsel'
  430.     global.txt_err_notmem  = 'Speichermangel'
  431. END
  432. ELSE IF RESULT = 2 THEN DO        /* Italiano */
  433.     global.txt_title_menu  = 'Percorso animazione'
  434.     global.txt_title_new   = 'Nuovo percorso animazione'
  435.     global.txt_title_load  = 'Leggere percorso animazione'
  436.     global.txt_title_save  = 'Scrivere percorso animazione'
  437.     global.txt_title_fhand = 'Definire a mano libera'
  438.     global.txt_title_line  = 'Definire lineare'
  439.     global.txt_title_edit  = 'Modificare percorso animazione'
  440.     global.txt_title_movrs = 'Spostare percorso animazione'
  441.     global.txt_title_brot  = 'Angolo pennello'
  442.     global.txt_title_bshr  = 'Inclinazione pennello'
  443.     global.txt_title_bresz = 'Dimensione pennello'
  444.     global.txt_title_pview = 'Anteprima animazione'
  445.     global.txt_title_draw  = 'Creare animazione'
  446.     global.txt_title_data  = 'Dati percorso animazione'
  447.  
  448.     global.txt_menu_new    = 'Nuovo'
  449.     global.txt_menu_load   = 'Leggere...'
  450.     global.txt_menu_save   = 'Scrivere...'
  451.     global.txt_menu_fhand  = 'Definire a mano libera'
  452.     global.txt_menu_line   = 'Definire lineare'
  453.     global.txt_menu_edit   = 'Modificare'
  454.     global.txt_menu_movrs  = 'Spostare e ridimensionare'
  455.     global.txt_menu_brot   = 'Angolo pennello...'
  456.     global.txt_menu_bshr   = 'Inclinazione pennello...'
  457.     global.txt_menu_bresz  = 'Dimensione pennello...'
  458.     global.txt_menu_data   = 'Dati...'
  459.     global.txt_menu_prview = 'Anteprima'
  460.  
  461.     global.txt_gad_count   = 'Pa_ssi:'
  462.     global.txt_gad_add     = 'Aggiunta _fotogrammi:'
  463.     global.txt_gad_addf.0  = 'No'
  464.     global.txt_gad_addf.1  = 'S∞'
  465.     global.txt_gad_direct  = 'Direzi_one:'
  466.     global.txt_gad_dirct.0 = 'Avanti'
  467.     global.txt_gad_dirct.1 = 'Indietro'
  468.     global.txt_gad_dirct.2 = 'Fermo'
  469.     global.txt_gad_draw    = '_Animare'
  470.     global.txt_gad_quit    = '_Uscire'
  471.     global.txt_gad_rotats  = 'Cicli _rotazione:'
  472.     global.txt_gad_fromang = '_Da angolo:'
  473.     global.txt_gad_toang   = 'Ad a_ngolo:'
  474.     global.txt_gad_rotdir  = '_Senso:'
  475.     global.txt_gad_rotdr.0 = 'Orario'
  476.     global.txt_gad_rotdr.1 = 'Antiorario'
  477.     global.txt_gad_shears  = 'Cicli _inclinazione:'
  478.     global.txt_gad_fromshx = '_Da orizzontale:'
  479.     global.txt_gad_toshx   = 'A ori_zzontale:'
  480.     global.txt_gad_fromshy = 'Da _verticale:'
  481.     global.txt_gad_toshy   = 'A ver_ticale:'
  482.     global.txt_gad_resizes = 'Cicli _ridimensionamento:'
  483.     global.txt_gad_fromrsx = '_Da orizzontale (%):'
  484.     global.txt_gad_torsx   = 'A ori_zzontale (%):'
  485.     global.txt_gad_fromrsy = 'Da _verticale (%):'
  486.     global.txt_gad_torsy   = 'A ver_ticale (%):'
  487.     global.txt_msg_points  = 'Punti:'
  488.     global.txt_msg_ptype.0 = '(percorso a mano libera)'
  489.     global.txt_msg_ptype.1 = '(percorso lineare)'
  490.  
  491.     global.txt_err_oldcl   = 'Questa procedura richiede_una versione pi∙ recente_di Personal Paint'
  492.     global.txt_err_lost    = 'Il percorso sarα cancellato'
  493.     global.txt_err_load    = 'Il file non pu≥ essere aperto'
  494.     global.txt_err_nopath  = 'Non Φ stato definito alcun percorso'
  495.     global.txt_err_save    = 'Il percorso non pu≥ essere scritto'
  496.     global.txt_err_nocbsh  = 'Le trasformazioni non possono essere applicate ai pennelli predefiniti'
  497.     global.txt_err_notbsh  = 'Le trasformationi non possono essere applicate: non vi Φ spazio per il pennello temporaneo'
  498.     global.txt_err_notmem  = 'Memoria insufficiente'
  499. END
  500. ELSE DO                /* English */
  501.     global.txt_title_menu  = 'Animation Path'
  502.     global.txt_title_new   = 'New Animation Path'
  503.     global.txt_title_load  = 'Load Animation Path'
  504.     global.txt_title_save  = 'Save Animation Path'
  505.     global.txt_title_fhand = 'Define Freehand Path'
  506.     global.txt_title_line  = 'Define Linear Path'
  507.     global.txt_title_edit  = 'Edit Animation Path'
  508.     global.txt_title_movrs = 'Move/Resize Animation Path'
  509.     global.txt_title_brot  = 'Brush Angle'
  510.     global.txt_title_bshr  = 'Brush Shear'
  511.     global.txt_title_bresz = 'Brush Size'
  512.     global.txt_title_pview = 'Preview Animation'
  513.     global.txt_title_draw  = 'Draw Animation'
  514.     global.txt_title_data  = 'Animation Path Data'
  515.  
  516.     global.txt_menu_new    = 'New'
  517.     global.txt_menu_load   = 'Load...'
  518.     global.txt_menu_save   = 'Save...'
  519.     global.txt_menu_fhand  = 'Define Freehand'
  520.     global.txt_menu_line   = 'Define Linear'
  521.     global.txt_menu_edit   = 'Edit'
  522.     global.txt_menu_movrs  = 'Move and Resize'
  523.     global.txt_menu_brot   = 'Brush Angle...'
  524.     global.txt_menu_bshr   = 'Brush Shear...'
  525.     global.txt_menu_bresz  = 'Brush Size...'
  526.     global.txt_menu_data   = 'Data...'
  527.     global.txt_menu_prview = 'Preview'
  528.  
  529.     global.txt_gad_count   = 'C_ount:'
  530.     global.txt_gad_add     = 'Add _Frames:'
  531.     global.txt_gad_addf.0  = 'No'
  532.     global.txt_gad_addf.1  = 'Yes'
  533.     global.txt_gad_direct  = 'Directi_on:'
  534.     global.txt_gad_dirct.0 = 'Forward'
  535.     global.txt_gad_dirct.1 = 'Backward'
  536.     global.txt_gad_dirct.2 = 'Still'
  537.     global.txt_gad_draw    = '_Draw'
  538.     global.txt_gad_quit    = '_Quit'
  539.     global.txt_gad_rotats  = '_Rotation Cycles:'
  540.     global.txt_gad_fromang = '_From Angle:'
  541.     global.txt_gad_toang   = '_To Angle:'
  542.     global.txt_gad_rotdir  = '_Direction:'
  543.     global.txt_gad_rotdr.0 = 'Clockwise'
  544.     global.txt_gad_rotdr.1 = 'Counterclockwise'
  545.     global.txt_gad_shears  = '_Shear Cycles:'
  546.     global.txt_gad_fromshx = '_From Horizontal:'
  547.     global.txt_gad_toshx   = '_To Horizontal:'
  548.     global.txt_gad_fromshy = 'F_rom Vertical:'
  549.     global.txt_gad_toshy   = 'T_o Vertical:'
  550.     global.txt_gad_resizes = 'Re_size Cycles:'
  551.     global.txt_gad_fromrsx = '_From Horizontal (%):'
  552.     global.txt_gad_torsx   = '_To Horizontal (%):'
  553.     global.txt_gad_fromrsy = 'F_rom Vertical (%):'
  554.     global.txt_gad_torsy   = 'T_o Vertical (%):'
  555.     global.txt_msg_points  = 'Points:'
  556.     global.txt_msg_ptype.0 = '(freehand path)'
  557.     global.txt_msg_ptype.1 = '(linear path)'
  558.  
  559.     global.txt_err_oldcl   = 'This script requires a newer_version of Personal Paint'
  560.     global.txt_err_lost    = 'The path will be lost'
  561.     global.txt_err_load    = 'The path file cannot be opened'
  562.     global.txt_err_nopath  = 'No path has been defined'
  563.     global.txt_err_save    = 'The path cannot be saved'
  564.     global.txt_err_nocbsh  = 'Transformation can only be applied to user brushes'
  565.     global.txt_err_notbsh  = 'Transformation cannot be applied: no space for temporary brush'
  566.     global.txt_err_notmem  = 'Not enough memory'
  567. END
  568.  
  569. Version 'REXX'
  570. IF RESULT < 7 THEN DO
  571.     RequestNotify 'PROMPT "'global.txt_err_oldcl'"'
  572.     EXIT 10
  573. END
  574.  
  575. tmpname = 'T:PP_AnimPath'
  576. global.pathdisp = 1
  577.  
  578. CALL DefData
  579.  
  580. LockGUI
  581.  
  582. GetPaintMode
  583. global.savepmode = RESULT
  584.  
  585. GetBrushAttributes 'WIDTH'
  586. global.bshw = RESULT
  587. GetBrushAttributes 'HEIGHT'
  588. global.bshh = RESULT
  589. GetBrushAttributes 'HANDLEX'
  590. global.bshhx = RESULT
  591. GetBrushAttributes 'HANDLEY'
  592. global.bshhy = RESULT
  593.  
  594. GetBrushAttributes 'FRAMES'
  595. global.savebshfr = RESULT
  596. GetBrushAttributes 'FRAMEPOSITION'
  597. global.savebshfp = RESULT
  598. GetBrushNumber
  599. global.savebshnum = RESULT
  600. GetCurrentBrush
  601. global.savebsh = RESULT
  602.  
  603. SetCurrentBrush 'UNUSED'
  604. IF RC ~= 0 THEN
  605.     global.tbshnum = 0
  606. ELSE DO
  607.     GetBrushNumber
  608.     global.tbshnum = RESULT
  609. END
  610.  
  611. SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  612.  
  613. GetPen 'FOREGROUND'
  614. global.savepen = RESULT
  615. Get 'COLORS'
  616. global.xorpen = RESULT-1
  617. SetPen 'FOREGROUND' global.xorpen
  618.  
  619. Get 'BARS'
  620. savebars = RESULT
  621. Set '"BARS=0"'
  622.  
  623. Get 'GCLIP'
  624. saveclip = RESULT
  625. Set '"GCLIP=0"'
  626.  
  627. Get 'COORD'
  628. savecoord = RESULT
  629. Set '"COORD=0"'
  630.  
  631. DisableTools
  632. UnlockGUI
  633.  
  634. SIGNAL ON Break_C
  635.  
  636. /* load last used path and display it */
  637. CALL LoadPathFile(tmpname)
  638. CALL XorPath
  639.  
  640. Get 'SCREENH'
  641. IF RESULT < 206 THEN
  642.     mrows = 11
  643. ELSE
  644.     mrows = 12
  645.  
  646. command = 0
  647. DO FOREVER
  648.     Request '"'global.txt_title_menu'" COMPACT ',
  649.             '"LIST ACTION = , 12, 'command', 20, 'mrows', ',
  650.             ' ""'global.txt_menu_new'"", ',
  651.             ' ""'global.txt_menu_load'"", ',
  652.             ' ""'global.txt_menu_save'"", ',
  653.             ' ""'global.txt_menu_fhand'"", ',
  654.             ' ""'global.txt_menu_line'"", ',
  655.             ' ""'global.txt_menu_edit'"", ',
  656.             ' ""'global.txt_menu_movrs'"", ',
  657.             ' ""'global.txt_menu_brot'"", ',
  658.             ' ""'global.txt_menu_bshr'"", ',
  659.             ' ""'global.txt_menu_bresz'"", ',
  660.             ' ""'global.txt_menu_data'"", ',
  661.             ' ""'global.txt_menu_prview'"" ',
  662.             ' VSPACE = 4 ',
  663.             ' INTSTR = ""'global.txt_gad_count'"", 1, 32000, 'global.count' ',
  664.             ' VSPACE = 2 ',
  665.             ' CYCLE = ""'global.txt_gad_direct'"", 3, 'global.direct', ""'global.txt_gad_dirct.0'"", ""'global.txt_gad_dirct.1'"", ""'global.txt_gad_dirct.2'"" ' ||,
  666.             ' VSPACE = 2 ',
  667.             ' CHECK = ""'global.txt_gad_add'"", 'global.add' ' ||,
  668.             ' VSPACE = 2 ',
  669.             ' ACTION = ""'global.txt_gad_draw'"" ',
  670.             ' ACTION = ""'global.txt_gad_quit'"" "'
  671.     IF RC = 0 THEN DO
  672.         command = RESULT.1
  673.         global.count = RESULT.2
  674.         global.direct = RESULT.3
  675.         global.add = RESULT.4
  676.  
  677.         IF RESULT = 1 THEN DO    /* Draw */
  678.             IF DrawIt() THEN
  679.                 LEAVE
  680.         END
  681.         ELSE IF RESULT = 2 THEN    /* Quit */
  682.             LEAVE
  683.         ELSE DO     /* Command List */
  684.             IF      command = 0 THEN CALL NewPath
  685.             ELSE IF command = 1 THEN CALL LoadPath
  686.             ELSE IF command = 2 THEN CALL SavePath
  687.             ELSE IF command = 3 THEN CALL DefFreehand
  688.             ELSE IF command = 4 THEN CALL DefLinear
  689.             ELSE IF command = 5 THEN CALL EditPath
  690.             ELSE IF command = 6 THEN CALL MoveResizePath
  691.             ELSE IF command = 7 THEN CALL RotSettings
  692.             ELSE IF command = 8 THEN CALL ShearSettings
  693.             ELSE IF command = 9 THEN CALL ResizeSettings
  694.             ELSE IF command = 10 THEN CALL DisplayData
  695.             ELSE IF command = 11 THEN CALL PreviewPath
  696.         END
  697.     END
  698. END
  699.  
  700. CALL SavePathFile(tmpname)
  701. CALL Break_C
  702.  
  703. EXIT 0
  704.  
  705.  
  706.  
  707.  
  708.  
  709. DefData: PROCEDURE EXPOSE global.
  710.  
  711.     global.count  = 10
  712.     global.direct = 0
  713.     global.add    = 1
  714.  
  715.     global.rotats  = 1
  716.     global.fromang = 0 * 10000
  717.     global.toang   = 0 * 10000
  718.     global.rotdir  = 0
  719.  
  720.     global.shears  = 1
  721.     global.fromshx = 0
  722.     global.toshx   = 0
  723.     global.fromshy = 0
  724.     global.toshy   = 0
  725.  
  726.     global.resizes = 1
  727.     global.fromrsx = 100 * 10000
  728.     global.torsx   = 100 * 10000
  729.     global.fromrsy = 100 * 10000
  730.     global.torsy   = 100 * 10000
  731.  
  732.     global.points = 0
  733.     DROP global.xcoord. global.ycoord.
  734.  
  735.     RETURN
  736.  
  737.  
  738.  
  739.  
  740. NewPath: PROCEDURE EXPOSE global.
  741.  
  742.     RequestResponse 'TITLE "'global.txt_title_new'" PROMPT "'global.txt_err_lost'"'
  743.     IF RC = 0 THEN DO
  744.         IF global.points > 0 THEN
  745.             CALL XorPath
  746.  
  747.         CALL DefData
  748.     END
  749.  
  750.     RETURN
  751.  
  752.  
  753.  
  754.  
  755. LoadPathFile: PROCEDURE EXPOSE global.
  756.  
  757.     ok = 0
  758.     IF OPEN('pfile', ARG(1), 'R') THEN DO
  759.         LockGUI
  760.         IF READLN('pfile') = 'PPAINT PATH' THEN DO
  761.             IF READLN('pfile') = '1' THEN DO
  762.                 global.count  = READLN('pfile')
  763.                 global.direct = READLN('pfile')
  764.                 global.add    = READLN('pfile')
  765.  
  766.                 global.rotats  = READLN('pfile')
  767.                 global.fromang = READLN('pfile')
  768.                 global.toang   = READLN('pfile')
  769.                 global.rotdir  = READLN('pfile')
  770.  
  771.                 global.shears  = READLN('pfile')
  772.                 global.fromshx = READLN('pfile')
  773.                 global.toshx   = READLN('pfile')
  774.                 global.fromshy = READLN('pfile')
  775.                 global.toshy   = READLN('pfile')
  776.  
  777.                 global.resizes = READLN('pfile')
  778.                 global.fromrsx = READLN('pfile')
  779.                 global.torsx   = READLN('pfile')
  780.                 global.fromrsy = READLN('pfile')
  781.                 global.torsy   = READLN('pfile')
  782.  
  783.                 global.points = READLN('pfile')
  784.  
  785.                 DO point = 0 FOR global.points
  786.                     xy = READLN('pfile')
  787.                     PARSE VAR xy global.xcoord.point global.ycoord.point .
  788.                 END
  789.                 ok = 1
  790.             END
  791.         END
  792.         CALL CLOSE('pfile')
  793.         UnlockGUI
  794.     END
  795.  
  796.     RETURN ok
  797.  
  798.  
  799.  
  800.  
  801. LoadPath: PROCEDURE EXPOSE global.
  802.  
  803.     RequestFile 'TITLE "'global.txt_title_load'"'
  804.     IF RC = 0 THEN DO
  805.         PARSE VALUE RESULT WITH '"' pfilename '"'
  806.  
  807.         IF global.points > 0 THEN DO
  808.             CALL XorPath
  809.             CALL DefData
  810.         END
  811.  
  812.         IF LoadPathFile(pfilename) THEN
  813.             CALL XorPath
  814.         ELSE DO
  815.             CALL DefData
  816.             RequestNotify 'TITLE "'global.txt_title_load'" PROMPT "'global.txt_err_load'"'
  817.         END
  818.     END
  819.  
  820.     RETURN
  821.  
  822.  
  823.  
  824.  
  825. SavePathFile: PROCEDURE EXPOSE global.
  826.  
  827.     ok = 0
  828.     IF OPEN('pfile', ARG(1), 'W') THEN DO
  829.         LockGUI
  830.         CALL WRITELN('pfile', 'PPAINT PATH')
  831.         CALL WRITELN('pfile', '1')        /* version */
  832.  
  833.         CALL WRITELN('pfile', global.count)
  834.         CALL WRITELN('pfile', global.direct)
  835.         CALL WRITELN('pfile', global.add)
  836.  
  837.         CALL WRITELN('pfile', global.rotats)
  838.         CALL WRITELN('pfile', global.fromang)
  839.         CALL WRITELN('pfile', global.toang)
  840.         CALL WRITELN('pfile', global.rotdir)
  841.  
  842.         CALL WRITELN('pfile', global.shears)
  843.         CALL WRITELN('pfile', global.fromshx)
  844.         CALL WRITELN('pfile', global.toshx)
  845.         CALL WRITELN('pfile', global.fromshy)
  846.         CALL WRITELN('pfile', global.toshy)
  847.  
  848.         CALL WRITELN('pfile', global.resizes)
  849.         CALL WRITELN('pfile', global.fromrsx)
  850.         CALL WRITELN('pfile', global.torsx)
  851.         CALL WRITELN('pfile', global.fromrsy)
  852.         CALL WRITELN('pfile', global.torsy)
  853.  
  854.         CALL WRITELN('pfile', global.points)
  855.  
  856.         DO point = 0 FOR global.points
  857.             CALL WRITELN('pfile', global.xcoord.point' 'global.ycoord.point)
  858.         END
  859.         ok = 1
  860.         CALL CLOSE('pfile')
  861.         UnlockGUI
  862.     END
  863.  
  864.     RETURN ok
  865.  
  866.  
  867.  
  868.  
  869. SavePath: PROCEDURE EXPOSE global.
  870.  
  871.     IF global.points = 0 THEN DO
  872.         RequestNotify 'TITLE "'global.txt_title_save'" PROMPT "'global.txt_err_nopath'"'
  873.         RETURN
  874.     END
  875.  
  876.     RequestFile 'TITLE "'global.txt_title_save'" SAVEMODE'
  877.     IF RC = 0 THEN DO
  878.         PARSE VALUE RESULT WITH '"' pfilename '"'
  879.         IF ~SavePathFile(pfilename) THEN
  880.             RequestNotify 'TITLE "'global.txt_title_save'" PROMPT "'global.txt_err_save'"'
  881.     END
  882.  
  883.     RETURN
  884.  
  885.  
  886.  
  887.  
  888. XorVertex: PROCEDURE EXPOSE global.
  889.  
  890.     point = ARG(1)
  891.  
  892.     IF point > 0 THEN DO
  893.         IF point = 1 THEN
  894.             nfp = ''
  895.         ELSE
  896.             nfp = 'NOFIRSTPIXEL'
  897.         ppt = point - 1
  898.         DrawLine global.xcoord.ppt global.ycoord.ppt global.xcoord.point global.ycoord.point 'COMPLEMENT' nfp
  899.     END
  900.     npt = point + 1
  901.     IF npt < global.points THEN DO
  902.         IF point = 0 THEN
  903.             nfp = ''
  904.         ELSE
  905.             nfp = 'NOFIRSTPIXEL'
  906.         DrawLine global.xcoord.point global.ycoord.point global.xcoord.npt global.ycoord.npt 'COMPLEMENT' nfp
  907.     END
  908.  
  909.     RETURN
  910.  
  911.  
  912.  
  913.  
  914. EditPath: PROCEDURE EXPOSE global.
  915.  
  916.     IF global.points = 0 THEN DO
  917.         RequestNotify 'TITLE "'global.txt_title_edit'" PROMPT "'global.txt_err_nopath'"'
  918.         RETURN
  919.     END
  920.  
  921.     SetPointer 'DATA ',
  922.         '"0xC000,0x7000,0x3C00,0x3F00,0x1F00,0x1E00,0x0B00,0x0980,',
  923.         ' 0x0080,0x0000,0x0018,0x003C,0x0018,',
  924.         ' 0x4000,0xB000,0x4C00,0x4300,0x2000,0x2200,0x1500,0x1280,',
  925.         ' 0x0100,0x0000,0x0028,0x0044,0x0028" ',
  926.         'HEIGHT 13 OFFSETX -1 OFFSETY 0'
  927.  
  928.     DO FOREVER
  929.         WaitForClick 'DOWN POINT SHOWBRUSH'
  930.         IF RC = 0 THEN DO
  931.             PARSE VAR RESULT button xp yp .
  932.  
  933.             IF button > 1 THEN
  934.                 LEAVE
  935.             mindist = 30000
  936.             DO point = 0 FOR global.points
  937.                 GetDistance xp yp global.xcoord.point global.ycoord.point 'IMAGERATIO'
  938.                 IF RESULT < mindist THEN DO
  939.                     mindist = RESULT
  940.                     mindpt = point
  941.                 END
  942.             END
  943.             point = mindpt
  944.             prev_xp = xp
  945.             prev_yp = yp
  946.             drawn = 0
  947.  
  948.             DO FOREVER
  949.                 GetMousePosition
  950.                 PARSE VAR RESULT xp yp .
  951.  
  952.                 IF xp ~= prev_xp | yp ~= prev_yp | ~drawn THEN DO
  953.                     CALL XorVertex(point)
  954.                     global.xcoord.point = xp
  955.                     global.ycoord.point = yp
  956.                     CALL XorVertex(point)
  957.  
  958.                     prev_xp = xp
  959.                     prev_yp = yp
  960.                     drawn = 1
  961.                 END
  962.                 ELSE WaitForEvent
  963.  
  964.                 GetMouseButton
  965.                 IF RESULT = 0 THEN
  966.                     LEAVE
  967.             END
  968.         END
  969.         ELSE LEAVE
  970.     END
  971.     SetPointer
  972.     RETURN
  973.  
  974.  
  975.  
  976.  
  977. MoveResizePath: PROCEDURE EXPOSE global.
  978.  
  979.     IF global.points = 0 THEN DO
  980.         RequestNotify 'TITLE "'global.txt_title_movrs'" PROMPT "'global.txt_err_nopath'"'
  981.         RETURN
  982.     END
  983.  
  984.     SetPointer 'DATA ',
  985.         '"0xC000,0x7000,0x3C00,0x3F00,0x1FC0,0x1FC0,0x0F00,0x0D80,',
  986.         ' 0x04C0,0x0460,0x0020,',
  987.         ' 0x4000,0xB000,0x4C00,0x4300,0x20C0,0x2000,0x1100,0x1280,',
  988.         ' 0x0940,0x08A0,0x0040" ',
  989.         'HEIGHT 11 OFFSETX -1 OFFSETY 0'
  990.     minx = 32000
  991.     miny = 32000
  992.     maxx = -32000
  993.     maxy = -32000
  994.     DO point = 0 FOR global.points
  995.         IF global.xcoord.point < minx THEN minx = global.xcoord.point
  996.         IF global.xcoord.point > maxx THEN maxx = global.xcoord.point
  997.         IF global.ycoord.point < miny THEN miny = global.ycoord.point
  998.         IF global.ycoord.point > maxy THEN maxy = global.ycoord.point
  999.  
  1000.         origxc.point = global.xcoord.point
  1001.         origyc.point = global.ycoord.point
  1002.     END
  1003.     w1 = maxx - minx
  1004.     h1 = maxy - miny
  1005.     minx00 = minx
  1006.     miny00 = miny
  1007.     w100 = w1
  1008.     h100 = h1
  1009.  
  1010.     DO FOREVER
  1011.         WaitForClick 'DOWN POINT'
  1012.         IF RC = 0 THEN DO
  1013.             PARSE VAR RESULT button xp yp .
  1014.  
  1015.             IF button > 1 THEN
  1016.                 LEAVE
  1017.             resize = (xp > minx+w1/2 & yp > miny+h1/2)
  1018.             IF resize THEN DO
  1019.                 SetPointer 'DATA ',
  1020.                     '"0xC000,0x7000,0x3C00,0x3F00,0x1F00,0x1E00,0x0B00,0x0980,',
  1021.                     ' 0x00E0,0x00A0,0x00FE,0x0022,0x0022,0x0022,0x003E,',
  1022.                     ' 0x4000,0xB000,0x4C00,0x4300,0x2000,0x2200,0x1500,0x1280,',
  1023.                     ' 0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000" ',
  1024.                     'HEIGHT 15 OFFSETX -1 OFFSETY 0'
  1025.                 w10 = w1
  1026.                 h10 = h1
  1027.             END
  1028.             ELSE DO
  1029.                 minx0 = minx
  1030.                 miny0 = miny
  1031.             END
  1032.             CALL XorPath
  1033.             DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1034.             prev_xp = xp
  1035.             prev_yp = yp
  1036.  
  1037.             DO FOREVER
  1038.                 GetMousePosition
  1039.                 PARSE VAR RESULT xp yp .
  1040.  
  1041.                 IF xp ~= prev_xp | yp ~= prev_yp THEN DO
  1042.                     DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1043.                     IF resize THEN DO
  1044.                         w1 = w1 + (xp - prev_xp)
  1045.                         h1 = h1 + (yp - prev_yp)
  1046.                         IF w1 < 1 THEN w1 = 1
  1047.                         IF h1 < 1 THEN h1 = 1
  1048.                         maxx = minx + w1
  1049.                         maxy = miny + h1
  1050.                     END
  1051.                     ELSE DO
  1052.                         minx = minx + (xp - prev_xp)
  1053.                         miny = miny + (yp - prev_yp)
  1054.                         maxx = minx + w1
  1055.                         maxy = miny + h1
  1056.                     END
  1057.                     DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1058.                     prev_xp = xp
  1059.                     prev_yp = yp
  1060.                 END
  1061.                 ELSE WaitForEvent
  1062.  
  1063.                 GetMouseButton
  1064.                 IF RESULT = 0 THEN
  1065.                     LEAVE
  1066.             END
  1067.  
  1068.             DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1069.             IF resize THEN DO
  1070.                 IF w10 ~= w1 | h10 ~= h1 THEN DO
  1071.                     mx = w1 / w100
  1072.                     my = h1 / h100
  1073.                     DO point = 0 FOR global.points
  1074.                         global.xcoord.point = minx + TRUNC((origxc.point - minx00) * mx)
  1075.                         global.ycoord.point = miny + TRUNC((origyc.point - miny00) * my)
  1076.                     END
  1077.                 END
  1078.                 SetPointer 'DATA ',
  1079.                     '"0xC000,0x7000,0x3C00,0x3F00,0x1FC0,0x1FC0,0x0F00,0x0D80,',
  1080.                     ' 0x04C0,0x0460,0x0020,',
  1081.                     ' 0x4000,0xB000,0x4C00,0x4300,0x20C0,0x2000,0x1100,0x1280,',
  1082.                     ' 0x0940,0x08A0,0x0040" ',
  1083.                     'HEIGHT 11 OFFSETX -1 OFFSETY 0'
  1084.             END
  1085.             ELSE DO
  1086.                 IF minx ~= minx0 | miny ~= miny0 THEN DO
  1087.                     dx = minx - minx0
  1088.                     dy = miny - miny0
  1089.                     DO point = 0 FOR global.points
  1090.                         global.xcoord.point = global.xcoord.point + dx
  1091.                         global.ycoord.point = global.ycoord.point + dy
  1092.                     END
  1093.                 END
  1094.             END
  1095.             CALL XorPath
  1096.         END
  1097.         ELSE LEAVE
  1098.     END
  1099.     SetPointer
  1100.  
  1101.     RETURN
  1102.  
  1103.  
  1104.  
  1105.  
  1106. SetFirstBrush: PROCEDURE EXPOSE global.
  1107.  
  1108.     IF global.fromang = 0 & global.fromshx = 0 & global.fromshy = 0 & ,
  1109.          global.fromrsx = 1000000 & global.fromrsy = 1000000 THEN
  1110.         SetCurrentBrush global.savebsh
  1111.     ELSE DO
  1112.         SetCurrentBrush 'BRUSH' global.tbshnum
  1113.         IF RC ~= 0 THEN
  1114.             RETURN
  1115.         CopyBrush global.savebshnum 'NOFRAMES'
  1116.         IF RC ~= 0 THEN
  1117.             RETURN
  1118.  
  1119.         IF global.fromang ~= 0 THEN DO
  1120.             RotateBrush TRUNC(global.fromang / 10 + 0.5) 'NOPROGRESS'
  1121.             IF RC ~= 0 THEN
  1122.                 RETURN
  1123.         END
  1124.         IF global.fromshx ~= 0 | global.fromshy ~= 0 THEN DO
  1125.             shearx = TRUNC(global.fromshx + 0.5 * SIGN(global.fromshx))
  1126.             sheary = TRUNC(global.fromshy + 0.5 * SIGN(global.fromshy))
  1127.             ShearBrush shearx sheary 'NOPROGRESS'
  1128.             IF RC ~= 0 THEN
  1129.                 RETURN
  1130.         END
  1131.  
  1132.         IF global.fromrsx ~= 1000000 | global.fromrsy ~= 1000000 THEN DO
  1133.             GetBrushAttributes 'WIDTH'
  1134.             w = TRUNC(RESULT * (global.fromrsx / 1000000) + 0.5)
  1135.             GetBrushAttributes 'HEIGHT'
  1136.             h = TRUNC(RESULT * (global.fromrsy / 1000000) + 0.5)
  1137.             IF w < 1 THEN w = 1
  1138.             IF h < 1 THEN h = 1
  1139.             SetBrushAttributes 'WIDTH' w 'HEIGHT' h 'NOPROGRESS'
  1140.             IF RC ~= 0 THEN
  1141.                 RETURN
  1142.         END
  1143.     END
  1144.     SetPaintMode global.savepmode
  1145.     SetPen 'FOREGROUND' global.savepen
  1146.  
  1147.     RETURN
  1148.  
  1149.  
  1150.  
  1151.  
  1152. DefFreehand: PROCEDURE EXPOSE global.
  1153.  
  1154.     IF global.points > 0 THEN DO
  1155.         CALL XorPath
  1156.         DROP global.xcoord. global.ycoord.
  1157.         global.points = 0
  1158.     END
  1159.  
  1160.     LockGUI
  1161.     CALL SetFirstBrush
  1162.     UnlockGUI
  1163.  
  1164.     button = 0
  1165.     WaitForClick 'DOWN POINT SHOWBRUSH'
  1166.     IF RC = 0 THEN
  1167.         PARSE VAR RESULT button x0 y0 .
  1168.  
  1169.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1170.     SetPen 'FOREGROUND' global.xorpen
  1171.  
  1172.     IF button > 0 THEN DO
  1173.         prev_xp = x0
  1174.         prev_yp = y0
  1175.         global.xcoord.0 = x0
  1176.         global.ycoord.0 = y0
  1177.         point = 1
  1178.  
  1179.         DO FOREVER
  1180.             GetMousePosition
  1181.             PARSE VAR RESULT xp yp .
  1182.  
  1183.             IF xp ~= prev_xp | yp ~= prev_yp THEN DO
  1184.                 IF point = 1 THEN
  1185.                     nfp = ''
  1186.                 ELSE
  1187.                     nfp = 'NOFIRSTPIXEL'
  1188.                 DrawLine prev_xp prev_yp xp yp 'COMPLEMENT' nfp
  1189.  
  1190.                 global.xcoord.point = xp
  1191.                 global.ycoord.point = yp
  1192.                 point = point + 1
  1193.  
  1194.                 prev_xp = xp
  1195.                 prev_yp = yp
  1196.             END
  1197.             ELSE WaitForEvent
  1198.  
  1199.             GetMouseButton
  1200.             IF RESULT ~= button THEN
  1201.                 LEAVE
  1202.         END
  1203.         IF point = 1 THEN DO
  1204.             point = 2
  1205.             global.xcoord.1 = global.xcoord.0
  1206.             global.ycoord.1 = global.ycoord.0
  1207.         END
  1208.         global.points = point
  1209.     END
  1210.  
  1211.     RETURN
  1212.  
  1213.  
  1214.  
  1215.  
  1216. DefLinear: PROCEDURE EXPOSE global.
  1217.  
  1218.     IF global.points > 0 THEN DO
  1219.         CALL XorPath
  1220.         DROP global.xcoord. global.ycoord.
  1221.         global.points = 0
  1222.     END
  1223.  
  1224.     LockGUI
  1225.     CALL SetFirstBrush
  1226.     UnlockGUI
  1227.  
  1228.     button = 0
  1229.     WaitForClick 'DOWN POINT SHOWBRUSH'
  1230.     IF RC = 0 THEN
  1231.         PARSE VAR RESULT button x0 y0 .
  1232.  
  1233.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1234.     SetPen 'FOREGROUND' global.xorpen
  1235.  
  1236.     IF button > 0 THEN DO
  1237.         prev_xp = x0
  1238.         prev_yp = y0
  1239.         global.xcoord.0 = x0
  1240.         global.ycoord.0 = y0
  1241.         drawn = 0
  1242.  
  1243.         DO FOREVER
  1244.             GetMousePosition
  1245.             PARSE VAR RESULT xp yp .
  1246.  
  1247.             IF xp ~= prev_xp | yp ~= prev_yp | ~drawn THEN DO
  1248.                 IF drawn THEN
  1249.                     Undo
  1250.                 DrawLine x0 y0 xp yp 'COMPLEMENT'
  1251.  
  1252.                 global.xcoord.1 = xp
  1253.                 global.ycoord.1 = yp
  1254.                 prev_xp = xp
  1255.                 prev_yp = yp
  1256.                 drawn = 1
  1257.             END
  1258.             ELSE WaitForEvent
  1259.  
  1260.             GetMouseButton
  1261.             IF RESULT ~= button THEN
  1262.                 LEAVE
  1263.         END
  1264.         global.points = 2
  1265.     END
  1266.  
  1267.     RETURN
  1268.  
  1269.  
  1270.  
  1271.  
  1272. InitStep: PROCEDURE EXPOSE global.
  1273.  
  1274.     IF global.points = 2 THEN DO
  1275.         IF global.count > 1 THEN DO
  1276.             global.line_xs = (global.xcoord.1 - global.xcoord.0) / (global.count - 1)
  1277.             global.line_ys = (global.ycoord.1 - global.ycoord.0) / (global.count - 1)
  1278.         END
  1279.         ELSE DO
  1280.             global.line_xs = 0
  1281.             global.line_ys = 0
  1282.         END
  1283.         global.line_xp = global.xcoord.0
  1284.         global.line_yp = global.ycoord.0
  1285.     END
  1286.     ELSE DO
  1287.         global.point_s = global.points / global.count
  1288.         global.point_p = 0
  1289.     END
  1290.  
  1291.     IF global.fromang ~= global.toang | global.rotats > 1 THEN DO
  1292.         global.do_rot = 1
  1293.         IF global.fromang > global.toang & global.rotdir = 0 THEN
  1294.             rotdeg = (3600000 - global.fromang) + global.toang
  1295.         ELSE IF global.fromang < global.toang & global.rotdir = 1 THEN
  1296.             rotdeg = global.fromang + (3600000 - global.toang)
  1297.         ELSE
  1298.             rotdeg = ABS(global.toang - global.fromang)
  1299.  
  1300.         rotdeg = rotdeg + ((global.rotats - 1) * 3600000)
  1301.         IF global.count > 1 THEN
  1302.             global.rot_step =    rotdeg / (global.count - 1)
  1303.         ELSE
  1304.             global.rot_step =    0
  1305.         IF global.rotdir > 0 THEN
  1306.             global.rot_step = -global.rot_step
  1307.     END
  1308.     ELSE
  1309.         global.do_rot = 0
  1310.     global.rot_ang = global.fromang
  1311.  
  1312.     IF global.fromshx ~= global.toshx | global.fromshy ~= global.toshy | global.shears > 1 THEN DO
  1313.         global.do_shear = 1
  1314.         shearx = ABS(global.toshx - global.fromshx)
  1315.         IF global.count > 1 THEN
  1316.             global.shear_sx =    (shearx * global.shears) / (global.count - 1)
  1317.         ELSE
  1318.             global.shear_sx =    0
  1319.         IF global.toshx < global.fromshx THEN
  1320.             global.shear_sx = -global.shear_sx
  1321.         global.min_shx = MIN(global.fromshx, global.toshx)
  1322.         global.max_shx = MAX(global.fromshx, global.toshx)
  1323.  
  1324.         sheary = ABS(global.toshy - global.fromshy)
  1325.         IF global.count > 1 THEN
  1326.             global.shear_sy =    (sheary * global.shears) / (global.count - 1)
  1327.         ELSE
  1328.             global.shear_sy =    0
  1329.         IF global.toshy < global.fromshy THEN
  1330.             global.shear_sy = -global.shear_sy
  1331.         global.min_shy = MIN(global.fromshy, global.toshy)
  1332.         global.max_shy = MAX(global.fromshy, global.toshy)
  1333.     END
  1334.     ELSE
  1335.         global.do_shear = 0
  1336.     global.shear_x = global.fromshx
  1337.     global.shear_y = global.fromshy
  1338.  
  1339.     IF global.fromrsx ~= global.torsx | global.fromrsy ~= global.torsy | global.resizes > 1 THEN DO
  1340.         global.do_resize = 1
  1341.         resizex = ABS(global.torsx - global.fromrsx)
  1342.         IF global.count > 1 THEN
  1343.             global.resize_sx = (resizex * global.resizes) / (global.count - 1)
  1344.         ELSE
  1345.             global.resize_sx =    0
  1346.         IF global.torsx < global.fromrsx THEN
  1347.             global.resize_sx = -global.resize_sx
  1348.         global.min_rsx = MIN(global.fromrsx, global.torsx)
  1349.         global.max_rsx = MAX(global.fromrsx, global.torsx)
  1350.  
  1351.         resizey = ABS(global.torsy - global.fromrsy)
  1352.         IF global.count > 1 THEN
  1353.             global.resize_sy = (resizey * global.resizes) / (global.count - 1)
  1354.         ELSE
  1355.             global.resize_sy =    0
  1356.         IF global.torsy < global.fromrsy THEN
  1357.             global.resize_sy = -global.resize_sy
  1358.         global.min_rsy = MIN(global.fromrsy, global.torsy)
  1359.         global.max_rsy = MAX(global.fromrsy, global.torsy)
  1360.     END
  1361.     ELSE
  1362.         global.do_resize = 0
  1363.     global.resize_x = global.fromrsx
  1364.     global.resize_y = global.fromrsy
  1365.  
  1366.     global.do_transf = global.do_rot | global.rot_ang ~= 0 |,
  1367.                        global.do_shear | global.shear_x ~= 0 | global.shear_y ~= 0 |,
  1368.                        global.do_resize | global.resize_x ~= 1000000 | global.resize_y ~= 1000000
  1369.  
  1370.     RETURN
  1371.  
  1372.  
  1373.  
  1374.  
  1375. GetStep: PROCEDURE EXPOSE global.
  1376.  
  1377.     IF global.points = 2 THEN DO
  1378.         xp = TRUNC(global.line_xp + 0.5)
  1379.         yp = TRUNC(global.line_yp + 0.5)
  1380.     END
  1381.     ELSE DO
  1382.         point = TRUNC(global.point_p + 0.5)
  1383.         xp = global.xcoord.point
  1384.         yp = global.ycoord.point
  1385.     END
  1386.  
  1387.     RETURN xp yp
  1388.  
  1389.  
  1390.  
  1391.  
  1392. PreviewStep: PROCEDURE EXPOSE global.
  1393.  
  1394.     pos = ARG(1)
  1395.     IF global.do_transf THEN DO
  1396.         w = global.bshw
  1397.         h = global.bshh
  1398.         hx = global.bshhx
  1399.         hy = global.bshhy
  1400.  
  1401.         r.0.x = 0
  1402.         r.0.y = 0
  1403.         r.1.x = w - 1
  1404.         r.1.y = 0
  1405.         r.2.x = w - 1
  1406.         r.2.y = h - 1
  1407.         r.3.x = 0
  1408.         r.3.y = h - 1
  1409.  
  1410.         r.4.x = 0
  1411.         r.4.y = h % 2
  1412.         r.5.x = w % 2
  1413.         r.5.y = 0
  1414.         r.6.x = w - 1
  1415.         r.6.y = h % 2
  1416.  
  1417.         IF global.rot_ang ~= 0 THEN DO
  1418.             GetEllipsePoint 0 0 1000 1000 TRUNC(global.rot_ang / 10 + 0.5)
  1419.             PARSE VAR RESULT px py .
  1420.             spm = px / 1000
  1421.             cpm = -(py / 1000)
  1422.  
  1423.             minx = 32000
  1424.             miny = 32000
  1425.             maxx = -32000
  1426.             maxy = -32000
  1427.             DO pt = 0 TO 6
  1428.                 rptx = r.pt.x * cpm - r.pt.y * spm
  1429.                 rpty = r.pt.x * spm + r.pt.y * cpm
  1430.                 r.pt.x = TRUNC(rptx + 0.5 * SIGN(rptx))
  1431.                 r.pt.y = TRUNC(rpty + 0.5 * SIGN(rpty))
  1432.                 IF r.pt.x > maxx THEN maxx = r.pt.x
  1433.                 IF r.pt.y > maxy THEN maxy = r.pt.y
  1434.                 IF r.pt.x < minx THEN minx = r.pt.x
  1435.                 IF r.pt.y < miny THEN miny = r.pt.y
  1436.             END
  1437.             w = maxx - minx + 1
  1438.             h = maxy - miny + 1
  1439.  
  1440.             hx1 = hx * cpm - hy * spm
  1441.             hy1 = hx * spm + hy * cpm
  1442.             hx = TRUNC(hx1 + 0.5 * SIGN(hx1))
  1443.             hy = TRUNC(hy1 + 0.5 * SIGN(hy1))
  1444.         END
  1445.  
  1446.         IF global.shear_x ~= 0 | global.shear_y ~= 0 THEN DO
  1447.             w0 = w
  1448.             h0 = h
  1449.             shearx = TRUNC(global.shear_x + 0.5 * SIGN(global.shear_x))
  1450.             sheary = TRUNC(global.shear_y + 0.5 * SIGN(global.shear_y))
  1451.             w2 = w + ABS(shearx)
  1452.             h2 = h + ABS(sheary)
  1453.  
  1454.             minx = 32000
  1455.             miny = 32000
  1456.             DO pt = 0 TO 6
  1457.                 rptx = r.pt.x + (shearx * (r.pt.y / (h-1)))
  1458.                 rpty = r.pt.y + (sheary * (rptx / (w2-1)))
  1459.                 r.pt.x = TRUNC(rptx + 0.5 * SIGN(rptx))
  1460.                 r.pt.y = TRUNC(rpty + 0.5 * SIGN(rpty))
  1461.                 IF r.pt.x < minx THEN minx = r.pt.x
  1462.                 IF r.pt.y < miny THEN miny = r.pt.y
  1463.             END
  1464.             w = w2
  1465.             h = h2
  1466.             hx1 = hx * (w / w0) + minx
  1467.             hy1 = hy * (h / h0) + miny
  1468.             hx = TRUNC(hx1 + 0.5 * SIGN(hx1))
  1469.             hy = TRUNC(hy1 + 0.5 * SIGN(hy1))
  1470.         END
  1471.  
  1472.         IF global.resize_x ~= 1000000 | global.resize_y ~= 1000000 THEN DO
  1473.             multx = global.resize_x / 1000000
  1474.             multy = global.resize_y / 1000000
  1475.  
  1476.             DO pt = 0 TO 6
  1477.                 rptx = r.pt.x * multx
  1478.                 rpty = r.pt.y * multy
  1479.                 r.pt.x = TRUNC(rptx + 0.5 * SIGN(rptx))
  1480.                 r.pt.y = TRUNC(rpty + 0.5 * SIGN(rpty))
  1481.             END
  1482.  
  1483.             hx = TRUNC(hx * multx + 0.5 * SIGN(hx))
  1484.             hy = TRUNC(hy * multy + 0.5 * SIGN(hy))
  1485.         END
  1486.  
  1487.         PARSE VAR pos xpos ypos .
  1488.         pxseq = ''
  1489.         DO pt = 0 TO 6
  1490.             r.pt.x = xpos - hx + r.pt.x
  1491.             r.pt.y = ypos - hy + r.pt.y
  1492.             pxseq = pxseq r.pt.x r.pt.y
  1493.             IF pt = 3 | pt = 6 THEN DO
  1494.                 polypts.pt = pxseq
  1495.                 pxseq = ''
  1496.             END
  1497.         END
  1498.         Undo global.prvwundo
  1499.  
  1500.         IF ~global.add & global.prvwundo ~= 0 THEN DO
  1501.             IF global.direct = 0 THEN
  1502.                 SetFramePosition 'NEXT'
  1503.             ELSE IF global.direct = 1 THEN
  1504.                 SetFramePosition 'PREVIOUS'
  1505.         END
  1506.  
  1507.         DrawPolygon '"'polypts.3'" COMPLEMENT'
  1508.         DrawPolygon '"'polypts.6'" COMPLEMENT'
  1509.         global.prvwundo = 2
  1510.     END
  1511.     ELSE DO
  1512.         Undo global.prvwundo
  1513.  
  1514.         IF ~global.add & global.prvwundo ~= 0 THEN DO
  1515.             IF global.direct = 0 THEN
  1516.                 SetFramePosition 'NEXT'
  1517.             ELSE IF global.direct = 1 THEN
  1518.                 SetFramePosition 'PREVIOUS'
  1519.         END
  1520.  
  1521.         PutBrush pos
  1522.         global.prvwundo = 1
  1523.     END
  1524.  
  1525.     RETURN
  1526.  
  1527.  
  1528.  
  1529.  
  1530. NextStep: PROCEDURE EXPOSE global.
  1531.  
  1532.     IF global.points = 2 THEN DO
  1533.         global.line_xp = global.line_xp + global.line_xs
  1534.         global.line_yp = global.line_yp + global.line_ys
  1535.     END
  1536.     ELSE
  1537.         global.point_p = global.point_p + global.point_s
  1538.  
  1539.     IF global.do_rot THEN
  1540.         global.rot_ang = global.rot_ang + global.rot_step
  1541.  
  1542.     IF global.do_shear THEN DO
  1543.         global.shear_x = global.shear_x + global.shear_sx
  1544.         IF global.shear_sx > 0 THEN DO
  1545.             IF global.shear_x > global.max_shx THEN DO
  1546.                 excd = global.shear_x - global.max_shx
  1547.                 global.shear_x = global.max_shx - excd
  1548.                 global.shear_sx = -global.shear_sx
  1549.             END
  1550.         END
  1551.         ELSE DO
  1552.             IF global.shear_x < global.min_shx THEN DO
  1553.                 excd = global.min_shx - global.shear_x
  1554.                 global.shear_x = global.min_shx + excd
  1555.                 global.shear_sx = -global.shear_sx
  1556.             END
  1557.         END
  1558.  
  1559.         global.shear_y = global.shear_y + global.shear_sy
  1560.         IF global.shear_sy > 0 THEN DO
  1561.             IF global.shear_y > global.max_shy THEN DO
  1562.                 excd = global.shear_y - global.max_shy
  1563.                 global.shear_y = global.max_shy - excd
  1564.                 global.shear_sy = -global.shear_sy
  1565.             END
  1566.         END
  1567.         ELSE DO
  1568.             IF global.shear_y < global.min_shy THEN DO
  1569.                 excd = global.min_shy - global.shear_y
  1570.                 global.shear_y = global.min_shy + excd
  1571.                 global.shear_sy = -global.shear_sy
  1572.             END
  1573.         END
  1574.     END
  1575.  
  1576.     IF global.do_resize THEN DO
  1577.         global.resize_x = global.resize_x + global.resize_sx
  1578.         IF global.resize_sx > 0 THEN DO
  1579.             IF global.resize_x > global.max_rsx THEN DO
  1580.                 excd = global.resize_x - global.max_rsx
  1581.                 global.resize_x = global.max_rsx - excd
  1582.                 global.resize_sx = -global.resize_sx
  1583.             END
  1584.         END
  1585.         ELSE DO
  1586.             IF global.resize_x < global.min_rsx THEN DO
  1587.                 excd = global.min_rsx - global.resize_x
  1588.                 global.resize_x = global.min_rsx + excd
  1589.                 global.resize_sx = -global.resize_sx
  1590.             END
  1591.         END
  1592.  
  1593.         global.resize_y = global.resize_y + global.resize_sy
  1594.         IF global.resize_sy > 0 THEN DO
  1595.             IF global.resize_y > global.max_rsy THEN DO
  1596.                 excd = global.resize_y - global.max_rsy
  1597.                 global.resize_y = global.max_rsy - excd
  1598.                 global.resize_sy = -global.resize_sy
  1599.             END
  1600.         END
  1601.         ELSE DO
  1602.             IF global.resize_y < global.min_rsy THEN DO
  1603.                 excd = global.min_rsy - global.resize_y
  1604.                 global.resize_y = global.min_rsy + excd
  1605.                 global.resize_sy = -global.resize_sy
  1606.             END
  1607.         END
  1608.     END
  1609.  
  1610.     RETURN
  1611.  
  1612.  
  1613.  
  1614.  
  1615. PreviewBegin: PROCEDURE EXPOSE global.
  1616.  
  1617.     IF ~global.do_transf THEN DO
  1618.         SetCurrentBrush global.savebsh
  1619.         SetPaintMode global.savepmode
  1620.         SetPen 'FOREGROUND' global.savepen
  1621.     END
  1622.     GetFramePosition
  1623.     IF RC = 0 THEN
  1624.         global.savefrpos = RESULT
  1625.     ELSE
  1626.         global.savefrpos = 0
  1627.     global.prvwundo = 0
  1628.  
  1629.     RETURN
  1630.  
  1631.  
  1632.  
  1633.  
  1634. PreviewEnd: PROCEDURE EXPOSE global.
  1635.  
  1636.     Undo global.prvwundo
  1637.     IF ~global.do_transf THEN DO
  1638.         IF global.savebshfr > 1 THEN
  1639.             SetBrushAttributes 'FRAMEPOSITION' global.savebshfp
  1640.         SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1641.         SetPen 'FOREGROUND' global.xorpen
  1642.     END
  1643.     IF global.savefrpos > 0 THEN
  1644.         SetFramePosition global.savefrpos
  1645.  
  1646.     RETURN
  1647.  
  1648.  
  1649.  
  1650.  
  1651. PreviewPath: PROCEDURE EXPOSE global.
  1652.  
  1653.     IF global.points = 0 THEN DO
  1654.         RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_nopath'"'
  1655.         RETURN
  1656.     END
  1657.  
  1658.     CALL InitStep
  1659.  
  1660.     IF global.do_transf THEN DO
  1661.         IF WORD(global.savebsh, 1) ~= 'BRUSH' THEN DO
  1662.             RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_nocbsh'"'
  1663.             RETURN
  1664.         END
  1665.         IF global.tbshnum = 0 THEN DO
  1666.             RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_notbsh'"'
  1667.             RETURN
  1668.         END
  1669.     END
  1670.     LockGUI
  1671.     CALL XorPath
  1672.     CALL PreviewBegin
  1673.  
  1674.     DO cnt = 1 to global.count
  1675.         CALL PreviewStep( GetStep() )
  1676.         Wait 'TIME 200'
  1677.         CALL NextStep()
  1678.     END
  1679.     Wait 'TIME 200'
  1680.  
  1681.     CALL PreviewEnd
  1682.     CALL XorPath
  1683.     UnlockGUI
  1684.  
  1685.     RETURN
  1686.  
  1687.  
  1688.  
  1689.  
  1690. DrawStep: PROCEDURE EXPOSE global.
  1691.  
  1692.     pos = ARG(1)
  1693.     IF global.do_transf THEN DO
  1694.         SetCurrentBrush 'BRUSH' global.tbshnum
  1695.         IF RC ~= 0 THEN
  1696.             RETURN 0
  1697.         CopyBrush global.savebshnum 'NOFRAMES'
  1698.         IF RC ~= 0 THEN
  1699.             RETURN 0
  1700.  
  1701.         IF global.rot_ang ~= 0 THEN DO
  1702.             RotateBrush TRUNC(global.rot_ang / 10 + 0.5) 'NOPROGRESS'
  1703.             IF RC ~= 0 THEN
  1704.                 RETURN 0
  1705.         END
  1706.         IF global.shear_x ~= 0 | global.shear_y ~= 0 THEN DO
  1707.             shearx = TRUNC(global.shear_x + 0.5 * SIGN(global.shear_x))
  1708.             sheary = TRUNC(global.shear_y + 0.5 * SIGN(global.shear_y))
  1709.             ShearBrush shearx sheary 'NOPROGRESS'
  1710.             IF RC ~= 0 THEN
  1711.                 RETURN 0
  1712.         END
  1713.  
  1714.         IF global.resize_x ~= 1000000 | global.resize_y ~= 1000000 THEN DO
  1715.             GetBrushAttributes 'WIDTH'
  1716.             w = TRUNC(RESULT * (global.resize_x / 1000000) + 0.5)
  1717.             GetBrushAttributes 'HEIGHT'
  1718.             h = TRUNC(RESULT * (global.resize_y / 1000000) + 0.5)
  1719.             IF w < 1 THEN w = 1
  1720.             IF h < 1 THEN h = 1
  1721.             SetBrushAttributes 'WIDTH' w 'HEIGHT' h 'NOPROGRESS'
  1722.             IF RC ~= 0 THEN
  1723.                 RETURN 0
  1724.         END
  1725.         SetPaintMode global.savepmode
  1726.         SetPen 'FOREGROUND' global.savepen
  1727.         PutBrush pos
  1728.         FreeBrush 'FORCE'
  1729.         SetCurrentBrush global.savebsh
  1730.         IF RC ~= 0 THEN
  1731.             RETURN 0
  1732.  
  1733.         IF global.savebshfr > 1 THEN DO    /* get next frame */
  1734.             PutBrush '-1000 -1000'
  1735.             Undo
  1736.         END
  1737.     END
  1738.     ELSE
  1739.         PutBrush pos
  1740.  
  1741.     RETURN 1
  1742.  
  1743.  
  1744.  
  1745.  
  1746. DrawIt: PROCEDURE EXPOSE global.
  1747.  
  1748.     IF global.points = 0 THEN DO
  1749.         RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_nopath'"'
  1750.         RETURN 0
  1751.     END
  1752.  
  1753.     CALL InitStep
  1754.  
  1755.     IF global.do_transf THEN DO
  1756.         IF WORD(global.savebsh, 1) ~= 'BRUSH' THEN DO
  1757.             RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_nocbsh'"'
  1758.             RETURN 0
  1759.         END
  1760.         IF global.tbshnum = 0 THEN DO
  1761.             RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_notbsh'"'
  1762.             RETURN 0
  1763.         END
  1764.     END
  1765.  
  1766.     LockGUI
  1767.     CALL XorPath
  1768.     global.pathdisp = 0
  1769.     SetCurrentBrush global.savebsh
  1770.     SetPaintMode global.savepmode
  1771.     SetPen 'FOREGROUND' global.savepen
  1772.  
  1773.     IF global.add THEN DO
  1774.         GetFramePosition
  1775.         IF RC = 0 THEN
  1776.             frpos = RESULT
  1777.         ELSE
  1778.             frpos = 0
  1779.         AddFrames global.count
  1780.         IF global.direct = 1 THEN
  1781.             SetFramePosition frpos + global.count
  1782.     END
  1783.  
  1784.     DO cnt = 1 to global.count
  1785.         IF ~DrawStep( GetStep() ) THEN DO
  1786.             RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_notmem'"'
  1787.             LEAVE
  1788.         END
  1789.         IF global.direct = 0 THEN
  1790.             SetFramePosition 'NEXT'
  1791.         ELSE IF global.direct = 1 THEN
  1792.             SetFramePosition 'PREVIOUS'
  1793.         CALL NextStep()
  1794.     END
  1795.  
  1796.     IF global.savebshfr > 1 THEN
  1797.         SetBrushAttributes 'FRAMEPOSITION' global.savebshfp
  1798.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1799.     SetPen 'FOREGROUND' global.xorpen
  1800.     UnlockGUI
  1801.  
  1802.     RETURN 1
  1803.  
  1804.  
  1805.  
  1806.  
  1807. RotSettings: PROCEDURE EXPOSE global.
  1808.  
  1809.     Request '"'global.txt_title_brot'" ',
  1810.             '"INTSTR = ""'global.txt_gad_rotats'"", 1, 32000, 'global.rotats' ',
  1811.             ' INT10000STR = ""'global.txt_gad_fromang'"", 0, 3590000, 'global.fromang' ',
  1812.             ' INT10000STR = ""'global.txt_gad_toang'"", 0, 3590000, 'global.toang' ',
  1813.             ' CYCLE = ""'global.txt_gad_rotdir'"", 2, 'global.rotdir', ""'global.txt_gad_rotdr.0'"", ""'global.txt_gad_rotdr.1'"" "'
  1814.     IF RC = 0 THEN DO
  1815.         global.rotats = RESULT.1
  1816.         global.fromang = RESULT.2
  1817.         global.toang = RESULT.3
  1818.         global.rotdir = RESULT.4
  1819.     END
  1820.  
  1821.     RETURN
  1822.  
  1823.  
  1824.  
  1825.  
  1826. ShearSettings: PROCEDURE EXPOSE global.
  1827.  
  1828.     Request '"'global.txt_title_bshr'" ',
  1829.             '"INTSTR = ""'global.txt_gad_shears'"", 1, 32000, 'global.shears' ',
  1830.             ' INTSTR = ""'global.txt_gad_fromshx'"", -32000, 32000, 'global.fromshx' ',
  1831.             ' INTSTR = ""'global.txt_gad_toshx'"", -32000, 32000, 'global.toshx' ',
  1832.             ' INTSTR = ""'global.txt_gad_fromshy'"", -32000, 32000, 'global.fromshy' ',
  1833.             ' INTSTR = ""'global.txt_gad_toshy'"", -32000, 32000, 'global.toshy' "'
  1834.     IF RC = 0 THEN DO
  1835.         global.shears  = RESULT.1
  1836.         global.fromshx = RESULT.2
  1837.         global.toshx   = RESULT.3
  1838.         global.fromshy = RESULT.4
  1839.         global.toshy   = RESULT.5
  1840.     END
  1841.  
  1842.     RETURN
  1843.  
  1844.  
  1845.  
  1846.  
  1847. ResizeSettings: PROCEDURE EXPOSE global.
  1848.  
  1849.     Request '"'global.txt_title_bresz'" ',
  1850.             '"INTSTR = ""'global.txt_gad_resizes'"", 1, 32000, 'global.resizes' ',
  1851.             ' INT10000STR = ""'global.txt_gad_fromrsx'"", 00100, 320000000, 'global.fromrsx' ',
  1852.             ' INT10000STR = ""'global.txt_gad_torsx'"", 00100, 320000000, 'global.torsx' ',
  1853.             ' INT10000STR = ""'global.txt_gad_fromrsy'"", 00100, 320000000, 'global.fromrsy' ',
  1854.             ' INT10000STR = ""'global.txt_gad_torsy'"", 00100, 320000000, 'global.torsy' "'
  1855.     IF RC = 0 THEN DO
  1856.         global.resizes = RESULT.1
  1857.         global.fromrsx = RESULT.2
  1858.         global.torsx   = RESULT.3
  1859.         global.fromrsy = RESULT.4
  1860.         global.torsy   = RESULT.5
  1861.     END
  1862.  
  1863.     RETURN
  1864.  
  1865.  
  1866.  
  1867.  
  1868. DisplayData: PROCEDURE EXPOSE global.
  1869.  
  1870.     direct = global.direct
  1871.     add = global.add
  1872.     rotdir = global.rotdir
  1873.  
  1874.     str = COMPRESS(global.txt_gad_count, '_') global.count || '0A'x ||,
  1875.           COMPRESS(global.txt_gad_direct, '_') global.txt_gad_dirct.direct || '0A'x ||,
  1876.           COMPRESS(global.txt_gad_add, '_') global.txt_gad_addf.add || '0A'x ||,
  1877.           '0A'x ||,
  1878.           COMPRESS(global.txt_gad_rotats, '_') global.rotats || '0A'x ||,
  1879.           COMPRESS(global.txt_gad_fromang, '_') (global.fromang / 10000) || '0A'x ||,
  1880.           COMPRESS(global.txt_gad_toang, '_') (global.toang / 10000) || '0A'x ||,
  1881.           COMPRESS(global.txt_gad_rotdir, '_') global.txt_gad_rotdr.rotdir || '0A'x ||,
  1882.           '0A'x ||,
  1883.           COMPRESS(global.txt_gad_shears, '_') global.shears || '0A'x ||,
  1884.           COMPRESS(global.txt_gad_fromshx, '_') global.fromshx || '0A'x ||,
  1885.           COMPRESS(global.txt_gad_toshx, '_') global.toshx || '0A'x ||,
  1886.           COMPRESS(global.txt_gad_fromshy, '_') global.fromshy || '0A'x ||,
  1887.           COMPRESS(global.txt_gad_toshy, '_') global.toshy || '0A'x ||,
  1888.           '0A'x ||,
  1889.           COMPRESS(global.txt_gad_resizes, '_') global.resizes || '0A'x ||,
  1890.           COMPRESS(global.txt_gad_fromrsx, '_') (global.fromrsx / 10000) || '0A'x ||,
  1891.           COMPRESS(global.txt_gad_torsx, '_') (global.torsx / 10000) || '0A'x ||,
  1892.           COMPRESS(global.txt_gad_fromrsy, '_') (global.fromrsy / 10000) || '0A'x ||,
  1893.           COMPRESS(global.txt_gad_torsy, '_') (global.torsy / 10000) || '0A'x
  1894.  
  1895.     pos = 1
  1896.     DO FOREVER
  1897.         pos = INDEX(str, '"', pos)
  1898.         IF pos = 0 THEN
  1899.             BREAK
  1900.         str = INSERT('"', str, pos)
  1901.         pos = pos + 2
  1902.     END
  1903.  
  1904.     IF global.points > 0 THEN DO
  1905.         IF global.points = 2 THEN
  1906.             ptype = 1
  1907.         ELSE
  1908.             ptype = 0
  1909.  
  1910.         str = str ||,
  1911.               '0A'x ||,
  1912.               global.txt_msg_points global.points global.txt_msg_ptype.ptype || '0A'x ||,
  1913.               '0A'x
  1914.  
  1915.         DO point = 0 FOR global.points
  1916.             str = str || global.xcoord.point','global.ycoord.point || '0A'x
  1917.         END
  1918.     END
  1919.     RequestNotify '"'global.txt_title_data'" "'str'" SCROLL'
  1920.  
  1921.     RETURN
  1922.  
  1923.  
  1924.  
  1925.  
  1926. XorPath: PROCEDURE EXPOSE global.
  1927.  
  1928.     IF global.points > 0 THEN DO
  1929.         xp = global.xcoord.0
  1930.         yp = global.ycoord.0
  1931.         last = global.points - 1
  1932.  
  1933.         DO point = 1 TO last
  1934.             IF point = 1 THEN
  1935.                 nfp = ''
  1936.             ELSE
  1937.                 nfp = 'NOFIRSTPIXEL'
  1938.             DrawLine xp yp global.xcoord.point global.ycoord.point 'COMPLEMENT' nfp
  1939.  
  1940.             xp = global.xcoord.point
  1941.             yp = global.ycoord.point
  1942.         END
  1943.     END
  1944.  
  1945.     RETURN
  1946.  
  1947.  
  1948.  
  1949.  
  1950. Cleanup: PROCEDURE EXPOSE global.
  1951.  
  1952.     IF global.pathdisp THEN DO
  1953.         LockGUI
  1954.         CALL XorPath
  1955.         UnlockGUI
  1956.     END
  1957.  
  1958.     RETURN
  1959.  
  1960.  
  1961.  
  1962.  
  1963. Break_C:
  1964.  
  1965.     CALL Cleanup
  1966.  
  1967.     LockGUI
  1968.     SetPen 'FOREGROUND' global.savepen
  1969.     SetCurrentBrush global.savebsh
  1970.     SetPaintMode global.savepmode
  1971.     IF global.savebshfr > 1 THEN
  1972.         SetBrushAttributes 'FRAMEPOSITION' global.savebshfp
  1973.     Set '"BARS='savebars'"'
  1974.     Set '"GCLIP='saveclip'"'
  1975.     Set '"COORD='savecoord'"'
  1976.     EnableTools
  1977.     UnlockGUI
  1978.  
  1979.     RETURN
  1980.